{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a3847c39",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)\")': /simple/langchain-openai/\n",
      "  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)\")': /packages/34/d0/bb39691e8ca3748668aa660920afc20e4c92231f3bca0cf85c62214171d3/langchain_openai-0.3.16-py3-none-any.whl.metadata\n",
      "  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)\")': /packages/34/d0/bb39691e8ca3748668aa660920afc20e4c92231f3bca0cf85c62214171d3/langchain_openai-0.3.16-py3-none-any.whl.metadata\n"
     ]
    }
   ],
   "source": [
    "%%capture --no-stderr\n",
    "%pip install --quiet -U langchain_openai langchain_core langchain_community tavily-python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "747352c9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os, getpass\n",
    "\n",
    "from dotenv import load_dotenv,find_dotenv\n",
    "\n",
    "load_dotenv(find_dotenv())  # 加载 .env 文件中的环境变量\n",
    "\n",
    "def _set_env(var: str):\n",
    "    if not os.environ.get(var):\n",
    "        os.environ[var] = getpass.getpass(f\"{var}: \")\n",
    "\n",
    "_set_env(\"OPENAI_API_KEY\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cb7c93c",
   "metadata": {},
   "source": [
    "这里是一个实用的操作指南，介绍了聊天模型的所有功能，但下面我们将展示一些亮点。如果您已经安装了langchain-openai包。通过它，我们可以实例化我们的ChatOpenAI模型对象。如果您是第一次注册API，您应该会收到免费积分，这些积分应用于任何模型。您可以在这里查看各种模型的定价。笔记本将默认使用gpt-4o，因为它在质量，价格和速度之间取得了良好的平衡 ，但您也可以选择价格较低的gpt-3.5系列型号。\n",
    "\n",
    "我们可以使用聊天模型设置一些标准参数，其中常见的两个是：\n",
    " - model： 模型名称\n",
    " - temperature： 采样温度\n",
    " \n",
    "temperature控制模型输出的随机性或创造性，其中低温（接近0）具有更确定性和更集中的输出。这对于需要准确性或事实响应的任务非常有用。高温（接近1）有利于完成创造性任务或产生不同的反应。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f5a73657",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "gpt4o_chat = ChatOpenAI(model=\"gpt-4o\", temperature=0)\n",
    "gpt35_chat = ChatOpenAI(model=\"gpt-3.5-turbo-0125\", temperature=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31f814b0",
   "metadata": {},
   "source": [
    "LangChain中的聊天模型有许多默认方法。大多数情况下，我们将使用：\n",
    "\n",
    "- stream：流回响应块\n",
    "- invoke：在输入上调用链\n",
    "\n",
    "并且，如上所述，聊天模型将信息作为输入。消息有一个角色（和谁在说话）和一个内容属性。我们稍后会更多地讨论信息。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "1c68721a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "AIMessage(content='你好！有什么我可以帮助你的吗？', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 10, 'prompt_tokens': 11, 'total_tokens': 21, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_ee1d74bde0', 'id': 'chatcmpl-BVy7UzzRIkBIgPknixO42Pqmo6ugL', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--61863db9-e0df-4478-9adb-0699a04120b7-0', usage_metadata={'input_tokens': 11, 'output_tokens': 10, 'total_tokens': 21, 'input_token_details': {}, 'output_token_details': {}})"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_core.messages import HumanMessage\n",
    "\n",
    "# 创建一个human消息\n",
    "msg = HumanMessage(content=\"你好\", name=\"Ronnie\")\n",
    "\n",
    "# 消息列表\n",
    "messages = [msg]\n",
    "\n",
    "# 使用消息列表调用模型\n",
    "gpt4o_chat.invoke(messages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2c1205ad",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "AIMessage(content='你好！有什么我可以帮助你的吗？', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 10, 'prompt_tokens': 8, 'total_tokens': 18, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_ee1d74bde0', 'id': 'chatcmpl-BVyIKzaPkX0cyOaeAHpVH2Nm6fEFz', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--aa129949-364d-42e0-a1cf-0bce374790c7-0', usage_metadata={'input_tokens': 8, 'output_tokens': 10, 'total_tokens': 18, 'input_token_details': {}, 'output_token_details': {}})"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpt4o_chat.invoke(\"你好\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "56c73ba7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "AIMessage(content='你好！有什么可以帮助你的吗？', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 9, 'total_tokens': 26, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': 'fp_0165350fbb', 'id': 'chatcmpl-BVyfXEdrkju6ufnL6Gs7jwMaqCiss', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--f9a5234f-5ab9-435d-89a5-fe528fc97918-0', usage_metadata={'input_tokens': 9, 'output_tokens': 17, 'total_tokens': 26, 'input_token_details': {}, 'output_token_details': {}})"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpt35_chat.invoke(\"你好\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be972338",
   "metadata": {},
   "source": [
    "## 搜索工具\n",
    "到 [Tavily](https://tavily.com) ,这是一个针对LLM和RAG优化的搜索引擎，旨在提供高效、快速和持久的搜索结Tavily需要大家自己注册，很容易注册并且免费套，但嘛，也可以使用其他搜索工具。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ec46dd92",
   "metadata": {},
   "outputs": [],
   "source": [
    "_set_env(\"TAVILY_API_KEY\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "43b6aa9d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.tools.tavily_search import TavilySearchResults\n",
    "tavily_search = TavilySearchResults(max_results=3)\n",
    "search_docs = tavily_search.invoke(\"2024年中国推出了什么AI的政策？\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "c7edbacd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'title': '逐浪AI大潮，中国向新而生 - 新华每日电讯',\n",
       "  'url': 'http://mrdx.xinhuanet.com/20250114/1e70fbc46964485585ca90f4afeb3e0e/c.html',\n",
       "  'content': '近年来，我国政府陆续出台多项鼓励人工智能技术创新与落地的政策，从《新一代人工智能发展规划》到地方级人工智能专项扶持计划，全面为AI产业发展提供了强大的政策保障。与此同时，我国AI产业规模快速扩张，涵盖智能制造、智慧医疗、智慧城市、金融科技等多个关键应用领域，形成了从基础技术研发到终端产品应用的完整产业链条。\\n随着人工智能生态渐趋成熟，在政策支持与产业布局的双重驱动下，2024年我国AI行业开始务实地专注于如何在生产、生活等方面积极增质提效。各种AI应用如雨后春笋般快速生长，在AI助手、AI视频、AI陪伴等细分赛道均跑出现象级产品。凭借我国在应用场景和用户上的优势，在AI应用领域这一轮发展中，我们在一定程度实现了弯道超车。\\n近几年，我国企业凭借深刻理解本地化需求和灵活的技术落地能力，在AI应用领域展现出显著的竞争优势。在工业场景中，AI技术助力制造业加速数字化转型；在智能客服和推荐系统等领域，技术成熟度不断提高，市场占有率稳步上升。从技术追赶到应用创新的转变，充分体现了我国AI产业的适应能力和创新潜力，为全球人工智能发展注入了新活力。',\n",
       "  'score': 0.83549726},\n",
       " {'title': '重磅！2024年中国及31省市生成式AI行业政策汇总 - 前瞻产业研究院',\n",
       "  'url': 'https://bg.qianzhan.com/trends/detail/506/240530-e6ad3f6b.html',\n",
       "  'content': '2024年中国及31省市生成式AI行业政策汇总、解读及发展目标分析政策鼓励生成式AI创新应用 从相关政策历程来看，我国生成式AI是在人工智能相关政策推出应运',\n",
       "  'score': 0.79901963},\n",
       " {'title': '[PDF] 政策聚焦新质生产力，2024 人工智能将发展',\n",
       "  'url': 'https://pdf.dfcfw.com/pdf/H3_AP202403071625925365_1.pdf',\n",
       "  'content': '随着后续GPT-4 Turbo、Sora 等产品的持续推出，我们看到人工. 智能作为“新质生产力”的典型代表，成为了2024 年政策的聚焦. 点。从2023 年12 月中央经济',\n",
       "  'score': 0.741169}]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "search_docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a382be7e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10",
   "language": "python",
   "name": "python310"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
